30 #include "GUI_Private.h"
56 #define LCD_MIRROR_Y 1
61 #define XSIZE_PHYS 320
62 #define YSIZE_PHYS 240
64 #define NUM_BUFFERS 1 // Number of multiple buffers to be used
65 #define NUM_VSCREENS 1 // Number of virtual screens to be used
67 #define BK_COLOR GUI_DARKBLUE
70 #define GUI_NUM_LAYERS 1
72 #define COLOR_CONVERSION_0 GUICC_M8888I
73 #define DISPLAY_DRIVER_0 GUIDRV_LIN_32
76 #if (GUI_NUM_LAYERS > 1)
77 #define COLOR_CONVERSION_1 GUICC_M8888I
78 #define DISPLAY_DRIVER_1 GUIDRV_LIN_32
82 #error Physical X size of display is not defined!
85 #error Physical Y size of display is not defined!
88 #define NUM_VSCREENS 1
90 #if (NUM_VSCREENS <= 0)
91 #error At least one screeen needs to be defined!
94 #if (NUM_VSCREENS > 1) && (NUM_BUFFERS > 1)
95 #error Virtual screens and multiple buffers are not allowed!
98 #define LCD_LAYER0_FRAME_BUFFER ((uint32_t)0xD0400000)
99 #define LCD_LAYER1_FRAME_BUFFER ((uint32_t)0xD0600000)
110 #define DEFINEDMA2D_COLORCONVERSION(PFIX, PIXELFORMAT) \
111 static void Color2IndexBulk_##PFIX##DMA2D(LCD_COLOR * pColor, void * pIndex, U32 NumItems, U8 SizeOfIndex) { \
112 DMA2D_Color2IndexBulk(pColor, pIndex, NumItems, SizeOfIndex, PIXELFORMAT); \
114 static void Index2ColorBulk_##PFIX##DMA2D(void * pIndex, LCD_COLOR * pColor, U32 NumItems, U8 SizeOfIndex) { \
115 DMA2D_Index2ColorBulk(pIndex, pColor, NumItems, SizeOfIndex, PIXELFORMAT); \
127 static DMA2D_HandleTypeDef hdma2d;
130 static const LCD_API_COLOR_CONV * apColorConvAPI[] =
133 #if GUI_NUM_LAYERS > 1
138 static U32 aBufferDMA2D [
XSIZE_PHYS *
sizeof(U32)];
139 static U32 aBuffer_FG [
XSIZE_PHYS *
sizeof(U32)];
140 static U32 aBuffer_BG [
XSIZE_PHYS *
sizeof(U32)];
150 static uint32_t LCD_LL_GetPixelformat(uint32_t LayerIndex);
151 static void DMA2D_CopyBuffer(uint32_t LayerIndex,
void * pSrc,
void * pDst, uint32_t xSize, uint32_t ySize, uint32_t OffLineSrc, uint32_t OffLineDst);
152 static void DMA2D_FillBuffer(uint32_t LayerIndex,
void * pDst, uint32_t xSize, uint32_t ySize, uint32_t OffLine, uint32_t ColorIndex);
153 static void LCD_LL_Init(
void);
154 static void LCD_LL_LayerInit(uint32_t LayerIndex);
156 static void CUSTOM_CopyBuffer(int32_t LayerIndex, int32_t IndexSrc, int32_t IndexDst);
157 static void CUSTOM_CopyRect(int32_t LayerIndex, int32_t x0, int32_t y0, int32_t x1, int32_t y1, int32_t xSize, int32_t ySize);
158 static void CUSTOM_FillRect(int32_t LayerIndex, int32_t x0, int32_t y0, int32_t x1, int32_t y1, uint32_t PixelIndex);
160 static void DMA2D_Index2ColorBulk(
void * pIndex, LCD_COLOR * pColor, uint32_t NumItems, U8 SizeOfIndex, uint32_t PixelFormat);
161 static void DMA2D_Color2IndexBulk(LCD_COLOR * pColor,
void * pIndex, uint32_t NumItems, U8 SizeOfIndex, uint32_t PixelFormat);
163 static void BSP_LCD_DrawBitmap8bpp(int32_t LayerIndex, int32_t
x, int32_t
y, U8
const * p, int32_t xSize, int32_t ySize, int32_t BytesPerLine);
164 static void BSP_LCD_DrawBitmap16bpp(int32_t LayerIndex, int32_t
x, int32_t
y, U16
const * p, int32_t xSize, int32_t ySize, int32_t BytesPerLine);
165 static void DMA2D_AlphaBlendingBulk(LCD_COLOR * pColorFG, LCD_COLOR * pColorBG, LCD_COLOR * pColorDst, U32 NumItems);
166 static void DMA2D_AlphaBlending(LCD_COLOR * pColorFG, LCD_COLOR * pColorBG, LCD_COLOR * pColorDst, U32 NumItems);
167 static LCD_PIXELINDEX * _LCD_GetpPalConvTable(
const LCD_LOGPALETTE GUI_UNI_PTR * pLogPal,
const GUI_BITMAP GUI_UNI_PTR * pBitmap,
int LayerIndex);
168 static LCD_COLOR DMA2D_MixColors(LCD_COLOR Color, LCD_COLOR BkColor, U8 Intens);
169 static void LCD_MixColorsBulk(U32 * pFG, U32 * pBG, U32 * pDst,
unsigned OffFG,
unsigned OffBG,
unsigned OffDest,
unsigned xSize,
unsigned ySize, U8 Intens);
177 static uint32_t GetBufferSize(uint32_t LayerIndex);
200 __HAL_RCC_DMA2D_CLK_ENABLE();
213 __HAL_RCC_DMA2D_FORCE_RESET();
216 __HAL_RCC_DMA2D_RELEASE_RESET();
229 GPIO_InitTypeDef GPIO_Init_Structure;
233 __HAL_RCC_LTDC_CLK_ENABLE();
236 __HAL_RCC_GPIOA_CLK_ENABLE();
237 __HAL_RCC_GPIOB_CLK_ENABLE();
238 __HAL_RCC_GPIOC_CLK_ENABLE();
239 __HAL_RCC_GPIOD_CLK_ENABLE();
240 __HAL_RCC_GPIOF_CLK_ENABLE();
241 __HAL_RCC_GPIOG_CLK_ENABLE();
263 GPIO_Init_Structure.Pin = GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_6 |
264 GPIO_PIN_11 | GPIO_PIN_12;
265 GPIO_Init_Structure.Mode = GPIO_MODE_AF_PP;
266 GPIO_Init_Structure.Pull = GPIO_NOPULL;
267 GPIO_Init_Structure.Speed = GPIO_SPEED_FAST;
268 GPIO_Init_Structure.Alternate= GPIO_AF14_LTDC;
269 HAL_GPIO_Init(GPIOA, &GPIO_Init_Structure);
272 GPIO_Init_Structure.Pin = GPIO_PIN_8 | \
273 GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11;
274 HAL_GPIO_Init(GPIOB, &GPIO_Init_Structure);
277 GPIO_Init_Structure.Pin = GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_10;
278 HAL_GPIO_Init(GPIOC, &GPIO_Init_Structure);
281 GPIO_Init_Structure.Pin = GPIO_PIN_3 | GPIO_PIN_6;
282 HAL_GPIO_Init(GPIOD, &GPIO_Init_Structure);
285 GPIO_Init_Structure.Pin = GPIO_PIN_10;
286 HAL_GPIO_Init(GPIOF, &GPIO_Init_Structure);
289 GPIO_Init_Structure.Pin = GPIO_PIN_6 | GPIO_PIN_7 | \
291 HAL_GPIO_Init(GPIOG, &GPIO_Init_Structure);
294 GPIO_Init_Structure.Pin = GPIO_PIN_0 | GPIO_PIN_1;
295 GPIO_Init_Structure.Alternate= GPIO_AF9_LTDC;
296 HAL_GPIO_Init(GPIOB, &GPIO_Init_Structure);
299 GPIO_Init_Structure.Pin = GPIO_PIN_10 | GPIO_PIN_12;
300 HAL_GPIO_Init(GPIOG, &GPIO_Init_Structure);
303 HAL_NVIC_SetPriority(LTDC_IRQn, 0xF, 0);
306 HAL_NVIC_EnableIRQ(LTDC_IRQn);
320 __HAL_RCC_LTDC_FORCE_RESET();
323 __HAL_RCC_LTDC_RELEASE_RESET();
339 if (layer_prop[layer].pending_buffer >= 0)
342 Addr = layer_prop[layer].address + layer_prop[layer].xSize * layer_prop[layer].ySize * layer_prop[layer].pending_buffer * layer_prop[layer].BytesPerPixel;
343 HAL_LTDC_SetAddress(hltdc, Addr, layer);
345 __HAL_LTDC_RELOAD_CONFIG(hltdc);
348 GUI_MULTIBUF_ConfirmEx(layer, layer_prop[layer].pending_buffer);
351 layer_prop[layer].pending_buffer = -1;
355 HAL_LTDC_ProgramLineEvent(hltdc, 0);
374 #if (NUM_BUFFERS > 1)
385 if (LCD_GetSwapXYEx(0)) {
393 #if (GUI_NUM_LAYERS > 1)
395 GUI_DEVICE_CreateAndLink(DISPLAY_DRIVER_1, COLOR_CONVERSION_1, 0, 1);
397 if (LCD_GetSwapXYEx(1)) {
408 #if (GUI_NUM_LAYERS > 1)
415 layer_prop[i].pColorConvAPI = (LCD_API_COLOR_CONV *)apColorConvAPI[i];
417 layer_prop[i].pending_buffer = -1;
420 LCD_SetVRAMAddrEx(i, (
void *)(layer_prop[i].address));
423 layer_prop[i].BytesPerPixel = LCD_GetBitsPerPixelEx(i) >> 3;
426 LCD_SetDevFunc(i, LCD_DEVFUNC_COPYBUFFER, (
void(*)(
void))CUSTOM_CopyBuffer);
427 LCD_SetDevFunc(i, LCD_DEVFUNC_COPYRECT, (
void(*)(
void))CUSTOM_CopyRect);
430 if (LCD_LL_GetPixelformat(i) <= LTDC_PIXEL_FORMAT_ARGB4444)
432 LCD_SetDevFunc(i, LCD_DEVFUNC_FILLRECT, (
void(*)(
void))CUSTOM_FillRect);
433 LCD_SetDevFunc(i, LCD_DEVFUNC_DRAWBMP_8BPP, (
void(*)(
void))BSP_LCD_DrawBitmap8bpp);
437 if (LCD_LL_GetPixelformat(i) == LTDC_PIXEL_FORMAT_RGB565) {
438 LCD_SetDevFunc(i, LCD_DEVFUNC_DRAWBMP_16BPP, (
void(*)(
void))BSP_LCD_DrawBitmap16bpp);
442 GUICC_M1555I_SetCustColorConv(Color2IndexBulk_M1555IDMA2D, Index2ColorBulk_M1555IDMA2D);
443 GUICC_M565_SetCustColorConv (Color2IndexBulk_M565DMA2D, Index2ColorBulk_M565DMA2D);
444 GUICC_M4444I_SetCustColorConv(Color2IndexBulk_M4444IDMA2D, Index2ColorBulk_M4444IDMA2D);
445 GUICC_M888_SetCustColorConv (Color2IndexBulk_M888DMA2D, Index2ColorBulk_M888DMA2D);
446 GUICC_M8888I_SetCustColorConv(Color2IndexBulk_M8888IDMA2D, Index2ColorBulk_M8888IDMA2D);
449 GUI_SetFuncAlphaBlending(DMA2D_AlphaBlending);
453 GUI_SetFuncGetpPalConvTable(_LCD_GetpPalConvTable);
456 GUI_SetFuncMixColors(DMA2D_MixColors);
459 GUI_SetFuncMixColorsBulk(LCD_MixColorsBulk);
483 case LCD_X_INITCONTROLLER:
484 LCD_LL_LayerInit(LayerIndex);
488 addr = layer_prop[LayerIndex].address + ((LCD_X_SETORG_INFO *)pData)->yPos * layer_prop[LayerIndex].xSize * layer_prop[LayerIndex].BytesPerPixel;
489 HAL_LTDC_SetAddress(&
hltdc, addr, LayerIndex);
492 case LCD_X_SHOWBUFFER:
493 layer_prop[LayerIndex].pending_buffer = ((LCD_X_SHOWBUFFER_INFO *)pData)->Index;
496 case LCD_X_SETLUTENTRY:
497 HAL_LTDC_ConfigCLUT(&
hltdc, (uint32_t *)&(((LCD_X_SETLUTENTRY_INFO *)pData)->Color), 1, LayerIndex);
501 __HAL_LTDC_ENABLE(&
hltdc);
505 __HAL_LTDC_DISABLE(&
hltdc);
509 if(((LCD_X_SETVIS_INFO *)pData)->OnOff == ENABLE )
511 __HAL_LTDC_LAYER_ENABLE(&
hltdc, LayerIndex);
515 __HAL_LTDC_LAYER_DISABLE(&
hltdc, LayerIndex);
517 __HAL_LTDC_RELOAD_CONFIG(&
hltdc);
521 HAL_LTDC_SetWindowPosition(&
hltdc,
522 ((LCD_X_SETPOS_INFO *)pData)->xPos,
523 ((LCD_X_SETPOS_INFO *)pData)->yPos,
528 GUI_GetLayerPosEx(LayerIndex, (
int*)&xPos, (
int*)&yPos);
529 layer_prop[LayerIndex].xSize = ((LCD_X_SETSIZE_INFO *)pData)->xSize;
530 layer_prop[LayerIndex].ySize = ((LCD_X_SETSIZE_INFO *)pData)->ySize;
531 HAL_LTDC_SetWindowPosition(&
hltdc, xPos, yPos, LayerIndex);
535 HAL_LTDC_SetAlpha(&
hltdc, ((LCD_X_SETALPHA_INFO *)pData)->Alpha, LayerIndex);
538 case LCD_X_SETCHROMAMODE:
539 if(((LCD_X_SETCHROMAMODE_INFO *)pData)->ChromaMode != 0)
541 HAL_LTDC_EnableColorKeying(&
hltdc, LayerIndex);
545 HAL_LTDC_DisableColorKeying(&
hltdc, LayerIndex);
549 case LCD_X_SETCHROMA:
551 Color = ((((LCD_X_SETCHROMA_INFO *)pData)->ChromaMin & 0xFF0000) >> 16) |\
552 (((LCD_X_SETCHROMA_INFO *)pData)->ChromaMin & 0x00FF00) |\
553 ((((LCD_X_SETCHROMA_INFO *)pData)->ChromaMin & 0x0000FF) << 16);
555 HAL_LTDC_ConfigColorKeying(&
hltdc, Color, LayerIndex);
572 static void LCD_LL_LayerInit(uint32_t LayerIndex)
575 static uint32_t LUT[256];
576 LTDC_LayerCfgTypeDef layer_cfg;
581 layer_cfg.WindowX0 = 0;
583 layer_cfg.WindowY0 = 0;
585 layer_cfg.PixelFormat = LCD_LL_GetPixelformat(LayerIndex);
586 layer_cfg.FBStartAdress = layer_prop[LayerIndex].address;
587 layer_cfg.Alpha = 255;
588 layer_cfg.Alpha0 = 0;
589 layer_cfg.Backcolor.Blue = 0;
590 layer_cfg.Backcolor.Green = 0;
591 layer_cfg.Backcolor.Red = 0;
592 layer_cfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA;
593 layer_cfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA;
596 HAL_LTDC_ConfigLayer(&
hltdc, &layer_cfg, LayerIndex);
599 if (LCD_GetBitsPerPixelEx(LayerIndex) <= 8)
602 HAL_LTDC_EnableCLUT(&
hltdc, LayerIndex);
607 if (layer_prop[LayerIndex].pColorConvAPI == GUICC_88666I)
609 HAL_LTDC_EnableCLUT(&
hltdc, LayerIndex);
611 for (i = 0; i < 256; i++)
613 LUT[i] = LCD_API_ColorConv_8666.pfIndex2Color(i);
615 HAL_LTDC_ConfigCLUT(&
hltdc, LUT, 256, LayerIndex);
626 static void LCD_LL_Init(
void)
628 static RCC_PeriphCLKInitTypeDef PeriphClkInitStruct;
630 HAL_LTDC_DeInit(&
hltdc);
647 hltdc.Init.HorizontalSync = 0;
648 hltdc.Init.VerticalSync = 0;
649 hltdc.Init.AccumulatedHBP = 70;
650 hltdc.Init.AccumulatedVBP = 13;
651 hltdc.Init.AccumulatedActiveW = 390;
652 hltdc.Init.AccumulatedActiveH = 253;
653 hltdc.Init.TotalWidth = 408;
654 hltdc.Init.TotalHeigh = 263;
657 hltdc.Init.Backcolor.Blue = 0;
658 hltdc.Init.Backcolor.Green = 0;
659 hltdc.Init.Backcolor.Red = 0;
666 PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_LTDC;
668 PeriphClkInitStruct.PLLSAI.PLLSAIN = 230;
670 PeriphClkInitStruct.PLLSAI.PLLSAIR = 2;
672 PeriphClkInitStruct.PLLSAIDivR = RCC_PLLSAIDIVR_16;
673 HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct);
676 hltdc.Init.HSPolarity = LTDC_HSPOLARITY_AL;
677 hltdc.Init.VSPolarity = LTDC_VSPOLARITY_AL;
678 hltdc.Init.DEPolarity = LTDC_DEPOLARITY_AL;
679 hltdc.Init.PCPolarity = LTDC_PCPOLARITY_IPC;
680 hltdc.Instance = LTDC;
682 HAL_LTDC_Init(&
hltdc);
683 HAL_LTDC_ProgramLineEvent(&
hltdc, 0);
686 hdma2d.Init.Mode = DMA2D_R2M;
687 hdma2d.Init.ColorMode = DMA2D_RGB565;
688 hdma2d.Init.OutputOffset = 0x0;
690 hdma2d.Instance = DMA2D;
692 if(HAL_DMA2D_Init(&hdma2d) != HAL_OK)
703 static uint32_t LCD_LL_GetPixelformat(uint32_t LayerIndex)
705 const LCD_API_COLOR_CONV * pColorConvAPI;
711 pColorConvAPI = layer_prop[LayerIndex].pColorConvAPI;
713 if (pColorConvAPI == GUICC_M8888I)
715 return LTDC_PIXEL_FORMAT_ARGB8888;
717 else if (pColorConvAPI == GUICC_M888)
719 return LTDC_PIXEL_FORMAT_RGB888;
721 else if (pColorConvAPI == GUICC_M565)
723 return LTDC_PIXEL_FORMAT_RGB565;
725 else if (pColorConvAPI == GUICC_M1555I)
727 return LTDC_PIXEL_FORMAT_ARGB1555;
729 else if (pColorConvAPI == GUICC_M4444I)
731 return LTDC_PIXEL_FORMAT_ARGB4444;
733 else if (pColorConvAPI == GUICC_8666)
735 return LTDC_PIXEL_FORMAT_L8;
737 else if (pColorConvAPI == GUICC_1616I)
739 return LTDC_PIXEL_FORMAT_AL44;
741 else if (pColorConvAPI == GUICC_88666I)
743 return LTDC_PIXEL_FORMAT_AL88;
752 static void DMA2D_CopyBuffer(uint32_t LayerIndex,
void * pSrc,
void * pDst, uint32_t xSize, uint32_t ySize, uint32_t OffLineSrc, uint32_t OffLineDst)
754 uint32_t PixelFormat;
756 PixelFormat = LCD_LL_GetPixelformat(LayerIndex);
757 DMA2D->CR = 0x00000000UL | (1 << 9);
760 DMA2D->FGMAR = (uint32_t)pSrc;
761 DMA2D->OMAR = (uint32_t)pDst;
762 DMA2D->FGOR = OffLineSrc;
763 DMA2D->OOR = OffLineDst;
766 DMA2D->FGPFCCR = PixelFormat;
769 DMA2D->NLR = (uint32_t)(xSize << 16) | (U16)ySize;
771 DMA2D->CR |= DMA2D_CR_START;
774 while (DMA2D->CR & DMA2D_CR_START)
783 static void DMA2D_FillBuffer(uint32_t LayerIndex,
void * pDst, uint32_t xSize, uint32_t ySize, uint32_t OffLine, uint32_t ColorIndex)
785 uint32_t PixelFormat;
787 PixelFormat = LCD_LL_GetPixelformat(LayerIndex);
790 DMA2D->CR = 0x00030000UL | (1 << 9);
791 DMA2D->OCOLR = ColorIndex;
794 DMA2D->OMAR = (uint32_t)pDst;
797 DMA2D->OOR = OffLine;
800 DMA2D->OPFCCR = PixelFormat;
803 DMA2D->NLR = (uint32_t)(xSize << 16) | (U16)ySize;
805 DMA2D->CR |= DMA2D_CR_START;
808 while (DMA2D->CR & DMA2D_CR_START)
818 static uint32_t GetBufferSize(uint32_t LayerIndex)
822 BufferSize = layer_prop[LayerIndex].xSize * layer_prop[LayerIndex].ySize * layer_prop[LayerIndex].BytesPerPixel;
830 static void CUSTOM_CopyBuffer(int32_t LayerIndex, int32_t IndexSrc, int32_t IndexDst) {
831 uint32_t BufferSize, AddrSrc, AddrDst;
833 BufferSize = GetBufferSize(LayerIndex);
834 AddrSrc = layer_prop[LayerIndex].address + BufferSize * IndexSrc;
835 AddrDst = layer_prop[LayerIndex].address + BufferSize * IndexDst;
836 DMA2D_CopyBuffer(LayerIndex, (
void *)AddrSrc, (
void *)AddrDst, layer_prop[LayerIndex].xSize, layer_prop[LayerIndex].ySize, 0, 0);
837 layer_prop[LayerIndex].buffer_index = IndexDst;
855 static void CUSTOM_CopyRect(int32_t LayerIndex, int32_t x0, int32_t y0, int32_t x1, int32_t y1, int32_t xSize, int32_t ySize)
857 U32 AddrSrc, AddrDst;
859 AddrSrc = layer_prop[LayerIndex].address + (y0 * layer_prop[LayerIndex].xSize + x0) * layer_prop[LayerIndex].BytesPerPixel;
860 AddrDst = layer_prop[LayerIndex].address + (y1 * layer_prop[LayerIndex].xSize + x1) * layer_prop[LayerIndex].BytesPerPixel;
861 DMA2D_CopyBuffer(LayerIndex, (
void *)AddrSrc, (
void *)AddrDst, xSize, ySize, layer_prop[LayerIndex].xSize - xSize, layer_prop[LayerIndex].xSize - xSize);
868 static void CUSTOM_FillRect(int32_t LayerIndex, int32_t x0, int32_t y0, int32_t x1, int32_t y1, uint32_t PixelIndex)
870 uint32_t BufferSize, AddrDst;
871 int32_t xSize, ySize;
873 if (GUI_GetDrawMode() == GUI_DM_XOR)
875 LCD_SetDevFunc(LayerIndex, LCD_DEVFUNC_FILLRECT, NULL);
876 LCD_FillRect(x0, y0, x1, y1);
877 LCD_SetDevFunc(LayerIndex, LCD_DEVFUNC_FILLRECT, (
void(*)(
void))CUSTOM_FillRect);
883 BufferSize = GetBufferSize(LayerIndex);
884 AddrDst = layer_prop[LayerIndex].address + BufferSize * layer_prop[LayerIndex].buffer_index + (y0 * layer_prop[LayerIndex].xSize + x0) * layer_prop[LayerIndex].BytesPerPixel;
885 DMA2D_FillBuffer(LayerIndex, (
void *)AddrDst, xSize, ySize, layer_prop[LayerIndex].xSize - xSize, PixelIndex);
895 static void DMA2D_LoadLUT(LCD_COLOR * pColor, uint32_t NumItems)
897 DMA2D->FGCMAR = (uint32_t)pColor;
900 DMA2D->FGPFCCR = LTDC_PIXEL_FORMAT_RGB888
901 | ((NumItems - 1) & 0xFF) << 8;
902 DMA2D->FGPFCCR |= (1 << 5);
912 static void InvertAlpha_SwapRB(LCD_COLOR * pColorSrc, LCD_COLOR * pColorDst, uint32_t NumItems)
917 Color = *pColorSrc++;
918 *pColorDst++ = ((Color & 0x000000FF) << 16)
919 | (Color & 0x0000FF00)
920 | ((Color & 0x00FF0000) >> 16)
921 | ((Color & 0xFF000000) ^ 0xFF000000);
922 }
while (--NumItems);
933 static void InvertAlpha(LCD_COLOR * pColorSrc, LCD_COLOR * pColorDst, uint32_t NumItems)
939 Color = *pColorSrc++;
940 *pColorDst++ = Color ^ 0xFF000000;
941 }
while (--NumItems);
952 static void DMA2D_AlphaBlendingBulk(LCD_COLOR * pColorFG, LCD_COLOR * pColorBG, LCD_COLOR * pColorDst, U32 NumItems)
955 DMA2D->CR = 0x00020000UL | (1 << 9);
958 DMA2D->FGMAR = (uint32_t)pColorFG;
959 DMA2D->BGMAR = (uint32_t)pColorBG;
960 DMA2D->OMAR = (uint32_t)pColorDst;
968 DMA2D->FGPFCCR = LTDC_PIXEL_FORMAT_ARGB8888;
969 DMA2D->BGPFCCR = LTDC_PIXEL_FORMAT_ARGB8888;
970 DMA2D->OPFCCR = LTDC_PIXEL_FORMAT_ARGB8888;
973 DMA2D->NLR = (uint32_t)(NumItems << 16) | 1;
977 DMA2D->CR |= DMA2D_CR_START;
979 while (DMA2D->CR & DMA2D_CR_START)
984 #if defined (__GNUC__)
985 #pragma GCC optimize ("O0")
996 static LCD_COLOR DMA2D_MixColors(LCD_COLOR Color, LCD_COLOR BkColor, U8 Intens)
998 uint32_t ColorFG, ColorBG, ColorDst;
1000 if ((BkColor & 0xFF000000) == 0xFF000000)
1004 ColorFG = Color ^ 0xFF000000;
1005 ColorBG = BkColor ^ 0xFF000000;
1008 DMA2D->CR = 0x00020000UL | (1 << 9);
1011 DMA2D->FGMAR = (uint32_t)&ColorFG;
1012 DMA2D->BGMAR = (uint32_t)&ColorBG;
1013 DMA2D->OMAR = (uint32_t)&ColorDst;
1016 DMA2D->FGPFCCR = LTDC_PIXEL_FORMAT_ARGB8888
1018 | ((uint32_t)Intens << 24);
1019 DMA2D->BGPFCCR = LTDC_PIXEL_FORMAT_ARGB8888
1021 | ((uint32_t)(255 - Intens) << 24);
1022 DMA2D->OPFCCR = LTDC_PIXEL_FORMAT_ARGB8888;
1025 DMA2D->NLR = (uint32_t)(1 << 16) | 1;
1028 DMA2D->CR |= DMA2D_CR_START;
1031 while (DMA2D->CR & DMA2D_CR_START)
1035 return (ColorDst ^ 0xFF000000);
1047 static void DMA2D_ConvertColor(
void * pSrc,
void * pDst, uint32_t PixelFormatSrc, uint32_t PixelFormatDst, uint32_t NumItems)
1051 DMA2D->CR = 0x00010000UL | (1 << 9);
1054 DMA2D->FGMAR = (uint32_t)pSrc;
1055 DMA2D->OMAR = (uint32_t)pDst;
1062 DMA2D->FGPFCCR = PixelFormatSrc;
1063 DMA2D->OPFCCR = PixelFormatDst;
1066 DMA2D->NLR = (uint32_t)(NumItems << 16) | 1;
1069 DMA2D->CR |= DMA2D_CR_START;
1071 while (DMA2D->CR & DMA2D_CR_START)
1086 static LCD_PIXELINDEX * _LCD_GetpPalConvTable(
const LCD_LOGPALETTE GUI_UNI_PTR * pLogPal,
const GUI_BITMAP GUI_UNI_PTR * pBitmap,
int LayerIndex)
1088 void (* pFunc)(void);
1089 int32_t DoDefault = 0;
1092 if (pBitmap->BitsPerPixel == 8)
1094 pFunc = LCD_GetDevFunc(LayerIndex, LCD_DEVFUNC_DRAWBMP_8BPP);
1099 if (pBitmap->pPal->HasTrans)
1124 return LCD_GetpPalConvTable(pLogPal);
1128 InvertAlpha_SwapRB((U32 *)pLogPal->pPalEntries, aBufferDMA2D, pLogPal->NumEntries);
1131 DMA2D_LoadLUT(aBufferDMA2D, pLogPal->NumEntries);
1134 return aBufferDMA2D;
1146 static void DMA2D_MixColorsBulk(LCD_COLOR * pColorFG, LCD_COLOR * pColorBG, LCD_COLOR * pColorDst, U8 Intens, uint32_t NumItems)
1149 DMA2D->CR = 0x00020000UL | (1 << 9);
1152 DMA2D->FGMAR = (uint32_t)pColorFG;
1153 DMA2D->BGMAR = (uint32_t)pColorBG;
1154 DMA2D->OMAR = (uint32_t)pColorDst;
1157 DMA2D->FGPFCCR = LTDC_PIXEL_FORMAT_ARGB8888
1159 | ((uint32_t)Intens << 24);
1160 DMA2D->BGPFCCR = LTDC_PIXEL_FORMAT_ARGB8888
1162 | ((uint32_t)(255 - Intens) << 24);
1163 DMA2D->OPFCCR = LTDC_PIXEL_FORMAT_ARGB8888;
1166 DMA2D->NLR = (uint32_t)(NumItems << 16) | 1;
1169 DMA2D->CR |= DMA2D_CR_START;
1171 while (DMA2D->CR & DMA2D_CR_START)
1184 static void DMA2D_AlphaBlending(LCD_COLOR * pColorFG, LCD_COLOR * pColorBG, LCD_COLOR * pColorDst, U32 NumItems)
1187 InvertAlpha(pColorFG, aBuffer_FG, NumItems);
1188 InvertAlpha(pColorBG, aBuffer_BG, NumItems);
1191 DMA2D_AlphaBlendingBulk(aBuffer_FG, aBuffer_BG, aBufferDMA2D, NumItems);
1194 InvertAlpha(aBufferDMA2D, pColorDst, NumItems);
1209 static void DMA2D_Index2ColorBulk(
void * pIndex, LCD_COLOR * pColor, uint32_t NumItems, U8 SizeOfIndex, uint32_t PixelFormat)
1212 DMA2D_ConvertColor(pIndex, aBufferDMA2D, PixelFormat, LTDC_PIXEL_FORMAT_ARGB8888, NumItems);
1215 InvertAlpha_SwapRB(aBufferDMA2D, pColor, NumItems);
1230 static void DMA2D_Color2IndexBulk(LCD_COLOR * pColor,
void * pIndex, uint32_t NumItems, U8 SizeOfIndex, uint32_t PixelFormat)
1233 InvertAlpha_SwapRB(pColor, aBufferDMA2D, NumItems);
1236 DMA2D_ConvertColor(aBufferDMA2D, pIndex, LTDC_PIXEL_FORMAT_ARGB8888, PixelFormat, NumItems);
1252 static void LCD_MixColorsBulk(U32 * pFG, U32 * pBG, U32 * pDst,
unsigned OffFG,
unsigned OffBG,
unsigned OffDest,
unsigned xSize,
unsigned ySize, U8 Intens)
1256 GUI_USE_PARA(OffFG);
1257 GUI_USE_PARA(OffDest);
1258 for (y = 0; y < ySize; y++)
1261 InvertAlpha(pFG, aBuffer_FG, xSize);
1262 InvertAlpha(pBG, aBuffer_BG, xSize);
1264 DMA2D_MixColorsBulk(aBuffer_FG, aBuffer_BG, aBufferDMA2D, Intens, xSize);
1266 InvertAlpha(aBufferDMA2D, pDst, xSize);
1267 pFG += xSize + OffFG;
1268 pBG += xSize + OffBG;
1269 pDst += xSize + OffDest;
1284 static void DMA2D_DrawBitmapL8(
void * pSrc,
void * pDst, uint32_t OffSrc, uint32_t OffDst, uint32_t PixelFormatDst, uint32_t xSize, uint32_t ySize)
1287 DMA2D->CR = 0x00010000UL | (1 << 9);
1290 DMA2D->FGMAR = (uint32_t)pSrc;
1291 DMA2D->OMAR = (uint32_t)pDst;
1294 DMA2D->FGOR = OffSrc;
1295 DMA2D->OOR = OffDst;
1298 DMA2D->FGPFCCR = LTDC_PIXEL_FORMAT_L8;
1299 DMA2D->OPFCCR = PixelFormatDst;
1302 DMA2D->NLR = (uint32_t)(xSize << 16) | ySize;
1305 DMA2D->CR |= DMA2D_CR_START;
1308 while (DMA2D->CR & DMA2D_CR_START)
1324 static void BSP_LCD_DrawBitmap16bpp(int32_t LayerIndex, int32_t
x, int32_t y, U16
const * p, int32_t xSize, int32_t ySize, int32_t BytesPerLine)
1326 uint32_t BufferSize, AddrDst;
1327 int32_t OffLineSrc, OffLineDst;
1329 BufferSize = GetBufferSize(LayerIndex);
1330 AddrDst = layer_prop[LayerIndex].address + BufferSize * layer_prop[LayerIndex].buffer_index + (y * layer_prop[LayerIndex].xSize +
x) * layer_prop[LayerIndex].BytesPerPixel;
1331 OffLineSrc = (BytesPerLine / 2) - xSize;
1332 OffLineDst = layer_prop[LayerIndex].xSize - xSize;
1333 DMA2D_CopyBuffer(LayerIndex, (
void *)p, (
void *)AddrDst, xSize, ySize, OffLineSrc, OffLineDst);
1347 static void BSP_LCD_DrawBitmap8bpp(int32_t LayerIndex, int32_t x, int32_t y, U8
const * p, int32_t xSize, int32_t ySize, int32_t BytesPerLine)
1349 uint32_t BufferSize, AddrDst;
1350 int32_t OffLineSrc, OffLineDst;
1351 uint32_t PixelFormat;
1353 BufferSize = GetBufferSize(LayerIndex);
1354 AddrDst = layer_prop[LayerIndex].address + BufferSize * layer_prop[LayerIndex].buffer_index + (y * layer_prop[LayerIndex].xSize +
x) * layer_prop[LayerIndex].BytesPerPixel;
1355 OffLineSrc = BytesPerLine - xSize;
1356 OffLineDst = layer_prop[LayerIndex].xSize - xSize;
1357 PixelFormat = LCD_LL_GetPixelformat(LayerIndex);
1358 DMA2D_DrawBitmapL8((
void *)p, (
void *)AddrDst, OffLineSrc, OffLineDst, PixelFormat, xSize, ySize);